home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 147 / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin / games / greversi / kama.lzh / SRC.LZH / src / main.s < prev    next >
Text File  |  2000-07-05  |  9KB  |  534 lines

  1. ;----------------------------------------------------------------
  2. ;    greversi.x v0.14 (2000.02.04) by M.Kamada
  3. ;    main.s メインルーチン
  4. ;----------------------------------------------------------------
  5.  
  6.     .include    doscall.mac
  7.     .include    iocscall.mac
  8.  
  9.     .include    const.equ
  10.  
  11. ;----------------------------------------------------------------
  12. ;バージョン
  13. PROGNAME    reg    'GREVERSI'
  14. LOWER_PROGNAME    reg    'greversi'
  15. VERSION        reg    '0.16'
  16. DATE        reg    '2000.07.05'
  17.  
  18. ;----------------------------------------------------------------
  19. ;プログラム開始位置
  20.     .text
  21.     .align    4,$2048
  22. prog_head::
  23.  
  24. ;----------------------------------------------------------------
  25. ;実行開始位置
  26.     .text
  27.     .align    4,$2048
  28. exec_entry:
  29.     lea.l    (16,a0),a0
  30.     suba.l    a0,a1
  31.     movem.l    a0-a1,-(sp)
  32.     DOS    _SETBLOCK
  33.     addq.l    #8,d0
  34.     tst.l    d0
  35.     bpl    @f
  36.     pea.l    (1f,pc)
  37.     DOS    _PRINT
  38.     addq.l    #4,sp
  39.     move.w    #-1,-(sp)
  40.     DOS    _EXIT2
  41. 1:    .dc.b    'メモリが不足しています',13,10,0
  42.     .even
  43. @@:
  44. ;----------------------------------------------------------------
  45. ;コマンドライン解析
  46.     lea.l    stack_area,sp
  47.  
  48.     bsr    mysrand
  49.  
  50.     sf.b    extern_name
  51.  
  52.     tst.b    (a2)+
  53.     beq    main_routine
  54.     movea.l    a2,a1
  55.  
  56. 10:    lea.l    temp,a0
  57.     bsr    getword
  58.     bmi    main_routine
  59.     beq    error_exit
  60.     move.b    (a0)+,d0
  61.     cmp.b    #'-',d0
  62.     bne    40f
  63.     bra    30f
  64.  
  65. 20:    cmpi.b    #' ',(a0)
  66.     bls    10b
  67. 30:    moveq.l    #$20,d0
  68.     or.b    (a0)+,d0
  69.  
  70. 9:    cmp.b    #'l',d0
  71.     bne    9f
  72.     bsr    stou
  73.     bcs    error_exit
  74.     cmp.w    #1,d0
  75.     blo    error_exit
  76.     cmp.w    #5,d0
  77.     bhi    error_exit
  78.     move.w    d0,level
  79.     bra    20b
  80.  
  81. 9:    cmp.b    #'m',d0
  82.     bne    9f
  83.     bsr    stou
  84.     bcs    error_exit
  85.     cmp.w    #4,d0
  86.     bcc    error_exit
  87.     move.w    d0,mode
  88.     bra    20b
  89.  
  90. 9:    cmp.b    #'q',d0
  91.     bne    9f
  92.     st.b    quick_exec
  93.     bra    20b
  94.  
  95. 9:    cmp.b    #'x',d0
  96.     bne    9f
  97.     tst.b    (a0)
  98.     bne    1f
  99.     lea.l    temp,a0
  100.     bsr    getword
  101.     bmi    error_exit
  102.     beq    error_exit
  103. 1:    bsr    init_extern
  104.     bmi    error_exit
  105.     bra    10b
  106.  
  107. 9:
  108.     bra    error_exit
  109.  
  110. 40:
  111.  
  112. ;----------------------------------------------------------------
  113. ;サブルーチンモード
  114. ;    コマンドラインで指定された盤の状態と手番から次の1手を求め,
  115. ;    終了コードで返す
  116.     moveq.l    #B,d6
  117.     moveq.l    #W,d7
  118.     cmp.b    #'0',d0
  119.     beq    @f
  120.     exg.l    d6,d7
  121.     cmp.b    #'1',d0
  122.     bne    error_exit
  123. @@:    tst.b    (a0)
  124.     bne    error_exit
  125.  
  126.     lea.l    temp,a0
  127.     bsr    getword
  128.  
  129.     lea.l    ban+P11,a1
  130.     moveq.l    #8-1,d2
  131. 2:    moveq.l    #8-1,d1
  132. 1:    move.b    (a0)+,d0
  133.     beq    error_exit
  134.     moveq.l    #B,d3
  135.     cmp.b    #'0',d0
  136.     beq    @f
  137.     moveq.l    #W,d3
  138.     cmp.b    #'1',d0
  139.     beq    @f
  140.     moveq.l    #S,d3
  141. @@:    move.b    d3,(a1)+
  142.     dbra    d1,1b
  143.     addq.l    #1,a1
  144.     dbra    d2,2b
  145.     lea.l    put_list_top,a5        ;置ける位置のリストの先頭
  146.     lea.l    put_record_btm,a6    ;レコードの末尾
  147.     bsr    count_ban
  148.     beq    error_exit        ;どこにも置けない
  149.     move.w    level,d0
  150.     bsr    think
  151.     divu.w    #9,d0
  152.     subq.w    #1,d0            ;縦
  153.     move.w    d0,d1
  154.     swap.w    d0
  155.     subq.w    #1,d0            ;横
  156.     lsl.w    #3,d1
  157.     add.w    d1,d0
  158.     move.w    d0,-(sp)
  159.     DOS    _EXIT2
  160.  
  161. ;----------------------------------------------------------------
  162. error_exit:
  163.     pea.l    (m_errmes,pc)
  164.     DOS    _PRINT
  165.     addq.l    #4,sp
  166.     move.w    #-1,-(sp)
  167.     DOS    _EXIT2
  168.  
  169. m_errmes:    .dc.b    PROGNAME,'.X v',VERSION,' (',DATE,') by M.Kamada',13,10
  170.         .dc.b    '使用法: ',LOWER_PROGNAME,' [スイッチ]',13,10
  171.         .dc.b    'スイッチ:',13,10
  172.         .dc.b    '  -lN',9,'レベル(N=1~5,大きいほど強い)[1]',13,10
  173.         .dc.b    '  -mN',9,'モード(N=0~3)[2]',13,10
  174.         .dc.b    9,'0=man-man,1=com-man,2=man-com,3=com-com',13,10
  175.         .dc.b    '  -x"ファイル名 レベル設定オプション"  comのとき外部思考ルーチンを呼び出す',13,10
  176.         .dc.b    9,'レベル設定オプションの直後にレベル(1~5)が入ります',13,10
  177.         .dc.b    0
  178.     .even
  179.  
  180.     .data
  181. quick_exec:    .dc.b    0
  182. think_extern:    .dc.b    0
  183. extern_quick:    .dc.b    0
  184.  
  185.     .bss
  186. temp:    .ds.b    256
  187.  
  188. ;----------------------------------------------------------------
  189. ;<a0.l:思考ルーチンの指定("greversi -l5"など)
  190.     .text
  191.     .even
  192. init_extern:
  193.     movem.l    d1-d7/a0-a6,-(sp)
  194.     movea.l    a0,a1
  195.     lea.l    extern_name,a0
  196.     bsr    strcpy
  197.     clr.l    -(sp)
  198.     pea.l    extern_param
  199.     pea.l    extern_name
  200.     move.w    #2,-(sp)
  201.     DOS    _EXEC
  202.     lea.l    (14,sp),sp
  203.     tst.l    d0
  204.     bmi    90f
  205.  
  206. .if 0
  207.     tst.b    quick_exec
  208.     beq    10f
  209.     clr.w    -(sp)
  210.     pea.l    extern_name
  211.     DOS    _OPEN
  212.     addq.l    #6,sp
  213.     move.l    d0,d1
  214.     bmi    10f
  215.     pea.l    64.w
  216.     pea.l    extern_quick_header
  217.     move.w    d1,-(sp)
  218.     DOS    _READ
  219.     move.l    d0,d2
  220.     DOS    _CLOSE
  221.     addq.l    #6,sp
  222.     cmp.l    (sp)+,d2
  223.     bne    10f
  224.     lea.l    extern_quick_header,a0
  225.     cmp.w    #'HU',(a0)
  226.     bne    10f
  227.     move.l    (12,a0),d0        ;text
  228.     add.l    (16,a0),d0        ;data
  229.     add.l    #240,d0            ;pdb
  230.     move.l    d0,extern_quick_pdbtextdata
  231.     move.l    (20,a0),d1        ;bss
  232.     move.l    d1,extern_quick_bss
  233.     add.l    d0,d1
  234.     move.l    d1,extern_quick_size
  235.     move.l    d0,-(sp)
  236.     move.w    #2,-(sp)
  237.     DOS    _MALLOC2
  238.     addq.l    #6,sp
  239.     move.l    d0,think_swap
  240.     bmi    10f
  241.     clr.l    -(sp)
  242.     pea.l    extern_param
  243.     pea.l    extern_name
  244.     move.w    #1,-(sp)
  245.     DOS    _EXEC
  246.     lea.l    (14,sp),sp
  247.     tst.l    d0
  248.     bmi    90f
  249.     movem.l    d0-d7/a0-a6,extern_quick_regs
  250.     lea.l    (16,a0)
  251.  
  252.     movem.l    extern_quick_regs,d0-d7/a0-a6
  253.     lea.l    (dummy_exit,pc),a4
  254.     move.l    a4,-(sp)
  255.     move.w    #4,-(sp)
  256.     DOS    _EXEC
  257.     addq.l    #6,sp
  258.     st.b    extern_quick
  259. 10:
  260. .endif
  261.     st.b    think_extern
  262.  
  263.     moveq.l    #0,d0
  264. 99:    movem.l    (sp)+,d1-d7/a0-a6
  265.     rts
  266.  
  267. 90:    moveq.l    #-1,d0
  268.     bra    99b
  269.  
  270. dummy_exit:
  271.     DOS    _EXIT
  272.  
  273.     .bss
  274. extern_name:    .ds.b    256
  275. extern_param:    .ds.b    256
  276.     .even
  277. extern_quick_header:    .ds.b    64
  278. extern_quick_pdbtextdata:    .ds.l    1
  279. extern_quick_bss:    .ds.l    1
  280. extern_quick_size:    .ds.l    1
  281. extern_quick_regs:    .ds.l    15
  282.  
  283. ;----------------------------------------------------------------
  284.     .text
  285.     .even
  286. exec_extern:
  287.     movem.l    d1-d7/a0-a6,-(sp)
  288. ;コマンドラインを作る
  289.     lea.l    extern_p+1,a0
  290.     lea.l    extern_param+1,a1
  291.     bsr    strcpy
  292.     moveq.l    #'0',d0
  293.     add.w    level,d0
  294.     move.b    d0,(a0)+
  295.     move.b    #' ',(a0)+
  296.     moveq.l    #'0',d0
  297.     cmp.b    #B,d6
  298.     beq    @f
  299.     moveq.l    #'1',d0
  300. @@:    move.b    d0,(a0)+
  301.     move.b    #' ',(a0)+
  302.     lea.l    ban+P11,a1
  303.     moveq.l    #8-1,d2
  304. 2:    moveq.l    #8-1,d1
  305. 1:    move.b    (a1)+,d3
  306.     moveq.l    #'0',d0
  307.     cmp.b    #B,d3
  308.     beq    @f
  309.     moveq.l    #'1',d0
  310.     cmp.b    #W,d3
  311.     beq    @f
  312.     moveq.l    #'2',d0
  313. @@:    move.b    d0,(a0)+
  314.     dbra    d1,1b
  315.     addq.l    #1,a1
  316.     dbra    d2,2b
  317.     sf.b    (a0)
  318.     move.l    a0,d0
  319.     sub.l    #extern_p+1,d0
  320.     move.b    d0,extern_p
  321. ;
  322.     clr.l    -(sp)
  323.     pea.l    extern_p
  324.     pea.l    extern_name
  325.     clr.w    -(sp)
  326.     DOS    _EXEC
  327.     lea.l    (14,sp),sp
  328.     tst.l    d0
  329.     bmi    90f
  330.  
  331.     cmp.l    #64,d0
  332.     bcc    90f
  333.     move.w    d0,d1
  334.     lsr.w    #3,d1
  335.     add.w    d1,d0
  336.     add.w    #10,d0
  337.     tst.l    d0
  338. 99:    movem.l    (sp)+,d1-d7/a0-a6
  339.     rts
  340.  
  341. 90:    moveq.l    #-1,d0
  342.     bra    99b
  343.  
  344. .if 0
  345.     move.l    -8(a4),-(sp)        *リミットアドレス
  346.     move.l    a4,-(sp)        *ロードアドレス
  347.     pea.l    (filename)r        *ファイル名
  348.     move.w    #3,-(sp)
  349.     DOS    _EXEC            *実際に読み込む
  350.     lea.l    14(sp),sp
  351. .endif
  352.  
  353.     .bss
  354. extern_p:    .ds.b    256
  355.  
  356. ;----------------------------------------------------------------
  357. ;メインルーチンモード
  358. ;    盤の状態を表示してゲームを行う
  359.     .text
  360.     .even
  361. main_routine:
  362.     move.w    #-1,-(sp)
  363.     DOS    _BREAKCK
  364.     move.w    d0,breakck_mode
  365.     move.w    #1,-(sp)        ;break on
  366.     DOS    _BREAKCK
  367.     addq.l    #2,sp
  368.  
  369.     lea.l    (main,pc),a0
  370.     bsr    takeback
  371.  
  372.     bsr    tini_screen
  373.  
  374.     move.w    breakck_mode,-(sp)
  375.     bmi    @f
  376.     DOS    _BREAKCK
  377. @@:    addq.l    #2,sp
  378.  
  379.     DOS    _EXIT
  380.  
  381. ;----------------------------------------------------------------
  382. ;メインルーチン
  383. main:
  384.     bsr    init_screen
  385.     sf.b    no_menu
  386. game_loop:
  387.     bsr    init_graph
  388.     bsr    init_think
  389.  
  390.     moveq.l    #B,d6            ;自分の石
  391.     moveq.l    #W,d7            ;相手の石
  392.  
  393.     lea.l    put_list_top,a5        ;置ける位置のリストの先頭
  394.     lea.l    put_record_btm,a6    ;レコードの末尾
  395.  
  396.     bsr    draw_ban
  397.     bsr    draw_black_count
  398.     bsr    draw_white_count
  399.  
  400.     clr.w    turn_count
  401.  
  402.     bsr    draw_turn        ;手番を表示する
  403.  
  404.     tst.b    no_menu
  405.     bne    @f
  406.     bsr    draw_menu
  407.     beq    main_exit
  408. @@:
  409.  
  410. main_loop:
  411.     DOS    _KEYSNS
  412.     bsr    count_ban
  413.     beq    main_pass        ;パス
  414.  
  415.     bsr    draw_turn        ;手番を表示する
  416.  
  417. main_loop1:
  418.     move.w    mode,d0
  419.     beq    main_man
  420.     moveq.l    #B,d1
  421.     subq.w    #2,d0
  422.     blo    @f
  423.     bhi    main_com
  424.     moveq.l    #W,d1
  425. @@:    cmp.b    d1,d6
  426.     beq    main_com
  427.  
  428. ;人間の手番のときマウスで入力させる
  429. main_man:
  430.     st.b    turn_man
  431.     sf.b    turn_com
  432. @@:    bsr    input_pos
  433.     bmi    main_menu
  434.     cmp.w    #255,d0
  435.     beq    @b            ;盤の外
  436.     lea.l    ban,a0
  437.     adda.l    d0,a0
  438.     tst.b    (a0)
  439.     bne    @b            ;石があるので置けない
  440.     bsr    put_record_one        ;石を置く
  441.     beq    @b            ;ひっくり返せないので置けない
  442.     bsr    tup_draw        ;表示する
  443.     bra    main_next
  444.  
  445. main_menu:
  446. @@:    IOCS    _MS_GETDT
  447.     tst.b    d0
  448.     bne    @b
  449.     bsr    draw_menu
  450.     beq    main_exit        ;終了
  451.     bmi    main_loop1        ;キャンセル
  452. ;対局
  453.     tst.w    turn_count
  454.     beq    main_loop1
  455.     st.b    no_menu
  456.     bra    game_loop
  457.  
  458. ;コンピュータの手番のとき
  459. main_com:
  460.     sf.b    turn_man
  461.     st.b    turn_com
  462.     IOCS    _MS_GETDT
  463.     tst.b    d0
  464.     bne    main_menu
  465.  
  466.     tst.b    think_extern
  467.     bne    1f
  468.     move.w    level,d0
  469.     bsr    think
  470.     bra    2f
  471. 1:    bsr    exec_extern
  472.     bmi    main_menu
  473. 2:
  474.     lea.l    ban,a0
  475.     adda.l    d0,a0
  476.     bsr    put_record_one        ;石を置く
  477.     beq    main_menu
  478.     bsr    tup_draw        ;表示する
  479. ;相手の手番に移る
  480. main_next:
  481.     exg.l    d6,d7
  482.     addq.w    #1,turn_count
  483.     bra    main_loop
  484.  
  485. ;パスのとき
  486. main_pass:
  487. ;相手の手番に移る
  488.     exg.l    d6,d7
  489.     bsr    count_ban        ;相手は置けるか
  490.     beq    main_over        ;両方ともパスなので終局
  491.     exg.l    d6,d7
  492.  
  493.     bsr    draw_turn        ;手番を表示する
  494.     bsr    draw_pass
  495.     exg.l    d6,d7
  496.     bra    main_loop
  497.  
  498. ;終局
  499. main_over:
  500.     sf.b    no_menu
  501.     bsr    draw_over
  502.     bmi    main_exit
  503.     move.w    mode,d0
  504.     beq    game_loop
  505.     cmp.w    #3,d0
  506.     beq    game_loop
  507.     eori.w    #3,d0
  508.     move.w    d0,mode
  509.     bra    game_loop
  510.  
  511. main_exit:
  512.     rts
  513.  
  514.     .data
  515.     .even
  516. level::        .dc.w    1        ;1~5
  517. mode::        .dc.w    2        ;0=man-man,1=com-man,2=man-com,3=com-com
  518. breakck_mode:    .dc.w    -1        ;_BREAKCKの元のモード
  519.  
  520.     .bss
  521. turn_man::    .ds.b    1
  522. turn_com::    .ds.b    1
  523. no_menu:    .ds.b    1        ;-1=ゲーム開始時にメニューを表示しない
  524.     .even
  525. turn_count::    .ds.w    1        ;手番カウンタ(0=先攻の最初の1手)
  526.  
  527.     .stack
  528.     .align    4
  529.         .ds.b    16384        ;スタックエリア
  530. stack_area:
  531.  
  532. ;----------------------------------------------------------------
  533.     .end    exec_entry
  534.